package HuffmanTrees;

/**
 * Unidad de almacenamiento minima de la codificacion Huffman
 * @author Vinicio Gomez
 * @since 13/09/2012
 * @version 1.0
 */
public class Node implements Comparable<Object> {
    /**
     * Representacion en codigo Huffman del caracter del nodo.
     */
    private String repr;
    /**
     * Frecuencia de aparicion del caracter.
     */
    private int freq;
    /**
     * Caracter a codificar.
     */
    private char ch;

    /**
     * Constructor.
     * @param ch el caracter a inicializar en el nodo
     * @pre  n/a
     * @post inicia un nodo con el caracter ch
     * @since 13709/2012
     */
    public Node(char ch) {
        this.ch = ch;
        this.freq = 1;
        this.repr = "";
    }
    
    /**
     * Constructor.
     * @param ch el caracter a inicializar en el nodo
     * @param freq la frecuencia del caracter ch
     * @pre  n/a
     * @post inicia un nodo con el caracter ch
     * @since 13709/2012
     */
    public Node(char ch, int freq) {
        this.ch = ch;
        this.freq = freq;
        this.repr = "";
    }

    /**
     * Constructor.
     * @param freq frecuencia inicial del caracter ch
     * @pre n/a
     * @post inicia un nodo con el caracter ch y la frecuencia freq
     * @since 13/09/2012
     */
    public Node(int freq) {
        this.freq = freq;
        this.ch = '-';
        this.repr = "";
    }

    /**
     * Obtener la representacion en codigo Huffman del nodo.
     * @return la representacion en codigo Huffman del nodo.
     * @pre n/a.
     * @post la cadena de repr.
     * @since 14/09/2012
     */
    public String getRepr() {
        return repr;
    }

    /**
     * Indicar cual sera la representacion en codigo Huffman del nodo.
     * @param repr la representacion en codigo Huffman del nodo.
     * @pre tener una representacion valida en codigo Huffman para el nodo.
     * @post la representacion es asignada.
     * @since 13/09/2012
     */
    public void setRepr(String repr) {
        this.repr = repr;
    }

    /**
     * Obtener la frecuencia del caracter en la cadena a codificar.
     * @return la frecuencia del caracter de este nodo en la cadena a codificar.
     * @pre n/a
     * @post se obtiene la frecuencia del nodo.
     * @since 13/09/2012
     */
    public int getFreq() {
        return freq;
    }

    /**
     * Obtener el caracter del nodo. 
     * @return el caracter del nodo. 
     * @pre n/a
     * @post el caracter del nodo.
     * @since 13/09/2012
     */
    public char getCh() {
        return ch;
    }

    /**
     * Aumentar la frecuencia del caracter en 1.
     * @pre n/a
     * @post la frecuencia es aumentada en 1
     * @since 13/09/2012
     */
    public void addFreq(){
        freq++;
    }

    /**
     * Compara dos nodos por medio de la frecuencia que poseen
     * @param other otro nodo a comparar
     * @return mayor a1 si el nodo actual es mayor, menor a 1 si el
     * nodo Other es mayor, 0 si son iguales
     */
    @Override
    public int compareTo(Object other) {
        Node that = (Node)other;
        return this.freq - that.freq;
    }
}
